<?php

class Admin_RolController extends Zend_Controller_Action {

    private $_debugLog;

    public function init() {
        /* Initialize action controller here */
        $this->_debugLog = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
        $default = Zend_Registry::get(VirtualLabs_Common::DEFAULT_MESSAGES);
        $this->view->saveConfirmMessage = $default->save_confirm_message;
        $this->_debugLog->info(print_r($default, true));
    }

    public function indexAction() {
        
    }

    public function preDispatch() {
        // Autenticacion del usuario
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity()) {
            $this->_helper->layout->disableLayout();
            $this->_forward("index", "index", "");
        } else {
            $identity = $auth->getIdentity();
            if ($identity['tipo_usuario'] != VirtualLabs_Admin_Usuario::ROL_ADMIN) {
                $this->_helper->layout->disableLayout();
                $this->_redirect('/');
            }
        }
        //fin de la autenicacion del usuario
    }

    public function listAction() {
        $this->_helper->viewRenderer->setNoRender(true);
        $this->_helper->layout->disableLayout();

        $rol = new Application_Model_Mapper_Rol();
        $rolDao = new VirtualLabs_Admin_Rol();
//        $list = $rol->fetchAll();
        $list = $rolDao->getALLRoles();
        $this->_debugLog->info("lista: " . print_r($list, true));
        $response = array();
        foreach ($list as $row) {
            $response [] = array($this->view->deleteUrl($row['codigo_rol'], "rol"),
                $this->view->editUrl($row['codigo_rol'], $row['nombre'], "rol"));
        }
        echo Zend_Json_Encoder::encode($response);
    }

    public function deleteAction() {
        $this->_helper->viewRenderer->setNoRender(true);
        $this->_helper->layout->disableLayout();
        $codigo_rol = $this->getRequest()->getParam("id");
        $codigoRol = array('key' => 'codigo_rol', 'value' => $codigo_rol);

        // Acceso a base de datos
        $rolDao = new VirtualLabs_Admin_Rol();
        //Se deben eliminar los datos asociados al rol y luego volver a insertar los seleccionados        
        $rolDao->deletePermisosAsociados($codigoRol);
        $rolDao->delete(VirtualLabs_Admin_Rol::TABLE_NAME, $codigoRol);
    }

    public function editAction() {
        $codigo_rol = $this->getRequest()->getParam("id");
        if ($codigo_rol) {
            $rol = new VirtualLabs_Admin_Rol();
            $rolData = $rol->getRoles("*", array("codigo_rol" => array("criteria" => "=", "value" => $codigo_rol)));
            $this->populateForm($rolData[0]);
        }
    }

    /*
     * Carga los datos del formulario dado un rol 
     * @param type $rolData campos a cargar en el formulario.
     */

    private function populateForm($rolData) {
        $this->view->codigoRol = $rolData['codigo_rol'];
        $this->view->nombre = $rolData['nombre'];
    }

    /*
     * Carga los datos del formulario dado un rol 
     */

    public function getformAction() {
        $this->_helper->viewRenderer->setNoRender(true);
        $this->_helper->layout->disableLayout(true);
        //$logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);

        $codigo_rol = $this->getRequest()->getParam("id");

        $permiso = new VirtualLabs_Admin_Permiso();
        $permisoData = $permiso->getPermisos(array('codigo_permiso', 'nombre', 'descripcion'), array());

        $html = "<form id='permission-form'><table>";
        $i = 0;
        foreach ($permisoData as $row) {
            //$logger->err(print_r($perm,true));       
            if ($i % 2 == 0) {
                $html .= "<tr>";
            }

            $html .= "<td><input title=\"" . $row['descripcion'] . "\" value=\"" . $row['codigo_permiso'] . "\"" .
                    "name=\"permission\" type=\"checkbox\" " . $this->checked($codigo_rol, $row['codigo_permiso']) . " >" . $row['nombre'] . "</td>"
            ;

            if ($i % 2 == 0) {
                $html .= "<tr>";
            }
        }
        $html .= "</table></form>";
        echo $html;
    }

    /*
     * Retorna "checked" si el codigo_rol esta asociado al codigo_permiso, caso contrario retorna "" 
     * @param type $codigo_rol
     * @param type $codigo_permiso
     */

    private function checked($codigo_rol, $codigo_permiso) {
        $retval = "";
        if (isset($codigo_rol)) {
            $rol_permiso = new VirtualLabs_Admin_Rol();
            if ($rol_permiso->isExistRolPermiso($codigo_rol, $codigo_permiso)) {
                $retval = "checked";
            }
        }
        return $retval;
    }

    public function saveAction() {
        $this->_helper->viewRenderer->setNoRender(true);
        $this->_helper->layout->disableLayout(true);
        //Obtenemos los parametros pasados como JSON a travez de la variable rol_permiso
        $parametros_JSON = $this->getRequest()->getParam("rol_permisos");

        $parametros_array = Zend_Json_Decoder::decode($parametros_JSON);
        $this->_debugLog->debug($parametros_JSON);

        //carga de variables
        //se asume que los dos primeros elementos del JSON pasado como parametro son
        //el codigo del rol y el nombre del rol
        $codigo_rol = $parametros_array["codigo"];
        $nombre_rol = $parametros_array["nombre"];

        // Acceso a base de datos
        $rolDao = new VirtualLabs_Admin_Rol();
        //parametro a guardar en la tabla rol
        $data_rol = array('nombre' => $nombre_rol);


        if (strlen($codigo_rol) > 0) {  // implica una modificacion si es true
            //guardar en la tabla rol el objeto modificado y luego 
            //eliminar los registros con la tabla permiso_rol con el codigo rol
            //para posteriormente cargar de vuelta los permisos asociados
            $codigoRol = array("codigo_rol = ?" => $codigo_rol);
            $rolDao->save($data_rol, $codigoRol);
        } else {    //implica un nuevo registro si es false
            $retval = $rolDao->save($data_rol);
            $codigo_rol = $retval['codigo_rol'];

            //cargamos el codigo rol retornado
            $this->_debugLog->debug("codigo rol al empezar3: $codigo_rol");
        }

        //Se deben eliminar los datos asociados al rol y luego volver a insertar los seleccionados
        $codigoRol = array('key' => 'codigo_rol', 'value' => $codigo_rol);
        $rolDao->deletePermisosAsociados($codigoRol);
        $this->_debugLog->debug(print_r($parametros_array));
        foreach ($parametros_array['permisos'] as $permiso) {
            $this->_debugLog->debug("[ inserting ] : [ $codigo_rol, {$permiso['value']} ]");

            $rolDao->insertPermisoAsociado($codigo_rol, $permiso["value"]);
        }
        echo "";
    }

}

